#ifndef NETLIB_TIMERQUEUE_H
#define NETLIB_TIMERQUEUE_H

// 定时器管理队列类

#include <set>
#include <vector>

#include "Mutex.h"
#include "Timestamp.h"
#include "Callbacks.h"
#include "Channel.h"

namespace netlib
{

namespace net
{

class EventLoop;
class Timer;
class TimerId;

class TimerQueue : noncopyable // 定时器管理队列类，不可拷贝
{
public:
    explicit TimerQueue(EventLoop* loop);

    ~TimerQueue();

    // 添加一个定时器，addTimerInLoop的封装
    TimerId addTimer(TimerCallback cb, Timestamp when, double interval);

    void cancel(TimerId timerId); // 关闭定时器，cancelInLoop的封装

private:

    typedef std::pair<Timestamp, Timer*> Entry;
    typedef std::set<Entry> TimerList;
    typedef std::pair<Timer*, int64_t> ActiveTimer;
    typedef std::set<ActiveTimer> ActiveTimerSet;

    void addTimerInLoop(Timer* timer); // 添加一个定时器

    void cancelInLoop(TimerId timerId); // 关闭定时器

    void handleRead(); // 超时回调函数

    // 返回超时的定时器列表
    std::vector<Entry> getExpired(Timestamp now);

    // 对超时的定时器进行重置
    void reset(const std::vector<Entry>& expired, Timestamp now);

    bool insert(Timer* timer); // 插入定时器

    EventLoop* loop_;           // 所属的EventLoop对象
    const int timerfd_;         // 定时器描述符
    Channel timerfdChannel_;    // 该定时器所关联的通道
    TimerList timers_;          // 定时器列表<时间戳，定时器指针>，按到期时间排序

    ActiveTimerSet activeTimers_;       // 定时器列表<定时器指针，序号>，按对象地址排序
    bool callingExpiredTimers_;         // 是否正在调用超时处理函数
    ActiveTimerSet cancelingTimers_;    // 定时器列表<定时器指针，序号>，被销毁的定时器

}; // class TimerQueue end

}  // namespace net end

}  // namespace netlib end
#endif